function [a,b,t3,index_max,fv1_max,amax,bmax] = main(N,x,Pc,Pm,M,DaiNo,Ci,ads,...
          ac,exV,par_Q,coe_Q,Run_No,Max_max_No,Min_min_No)
%% 输出参数界定
% a,b,t3,index,fv1,amax,bmax为输出变量，其中：
% a为目标函数值，为一行向量，列数等于Run_No；
% b为目标函数a对应的投影方向，为一n列Run_No行的矩阵；
% e为优秀个体变化区间的下限值；f为优秀个体变化区间的上限值；
% t3记录RAGA运行Run_No次中每次的时间;
% index_max和fv1_max主要为了后期绘制每代目标函数最大值随代数的变化曲线，其中：
% index_max为运行Run_No次中，目标函数最大值对应的加速次数向量；
% fv1_max为运行Run_No次中，目标函数最大值时对应每次加速目标函数最大值向量；
% N=400;Pc=0.8;Pm=0.2;M=10;Ci=20;DaiNo=2;ads=1;ac = 10^(-6);exV = 40;
% par_Q = 1;coe_Q = 0.1;
%% 输入参数界定
% Xa为原始输入样本数据；
% N为种群规模,一般默认为400；Pc为交叉概率,一般默认为0.8；
% Pm为变异概率,一般默认为0.2；
% DaiNo为了在进行两代进化之后加速一次而设定的限制数，一般默认为2；
% n优化变量数目，即个体的维度，需要根据输入数据确定；
% M变异方向所需要的随机数，一般默认为10；
% Ci为加速次数，一般默认为20；
% ads 为0是求最小值，为其它求最大值；
% ac为优秀种群上下限的差值，当该差值足够小时，即认为寻优结束，默认10^(-6)；
% exV为了加速所选择的优秀个体的数目
% par_Q和coe_Q为目标函数Target输入参数，其中：par_Q为投影半径类型参数;
% coe_Q为窗口半径调节系数，当par_Q=1时，取值范围[0 0.5];
% 当par_Q=2时，取值范围[1/5 1/3];
% Run_No为运行次数
% Max_max_No为越大越优性指标编号向量；
% Min_min_No为越小越优性指标编号向量；
%% 
% x=[8.00 	6.11 	6.00 	3	0.022 	6.44 	6.00 	6.67 	0.166 	6.00 	1.000 	7.78 
% 5.56 	5.89 	6.67 	3	0.019 	7.44 	6.33 	7.33 	0.847 	7.33 	0.615 	7.56 
% 7.33 	6.56 	6.00 	7	0.049 	6.89 	7.00 	7.78 	0.588 	6.67 	0.889 	7.78 
% 4.00 	5.78 	5.44 	2	0.018 	7.00 	5.89 	6.78 	0.463 	6.22 	0.833 	8.11 
% 7.89 	6.00 	7.11 	3	0.039 	6.89 	6.00 	7.00 	0.827 	7.00 	0.800 	7.11 
% 5.89 	7.33 	6.78 	3	0.024 	7.00 	6.67 	6.56 	0.938 	7.33 	0.833 	6.89 
% 7.89 	7.33 	7.78 	5	0.033 	7.56 	7.33 	8.00 	0.678 	7.56 	0.778 	7.78 
% 6.22 	6.44 	6.78 	2	0.017 	7.56 	7.22 	7.56 	0.629 	7.78 	0.800 	7.67 
% 5.78 	8.00 	7.33 	4	0.038 	7.89 	7.67 	8.00 	0.933 	7.78 	0.727 	8.11 
% 7.11 	7.56 	7.67 	6	0.039 	7.89 	7.56 	7.78 	0.958 	7.89 	0.769 	8.56 
% 8.22 	6.89 	6.33 	3	0.016 	8.00 	6.22 	7.67 	0.951 	8.00 	0.769 	8.44 
% 6.44 	7.00 	7.56 	4	0.030 	7.78 	8.11 	7.67 	1.436 	7.89 	0.722 	8.22 
% 8.33 	5.67 	5.44 	4	0.032 	6.11 	5.78 	6.78 	0.697 	6.22 	0.700 	7.67 
% 7.89 	6.67 	6.67 	3	0.013 	7.67 	7.00 	7.67 	0.696 	7.56 	0.667 	7.89 
% 5.00 	5.89 	5.89 	3	0.015 	6.78 	6.33 	6.89 	0.750 	6.33 	0.917 	7.44 
% 7.44 	6.11 	6.11 	4	0.028 	7.00 	6.89 	6.89 	0.594 	6.67 	1.000 	7.67 
% 8.67 	6.33 	5.78 	5	0.038 	5.89 	6.11 	6.11 	0.584 	6.33 	0.750 	7.44 
% 7.89 	6.11 	6.00 	5	0.028 	7.00 	6.22 	7.11 	0.744 	6.56 	0.900 	7.78 
% 7.56 	6.56 	6.67 	4	0.025 	7.11 	6.89 	7.22 	0.646 	7.33 	0.818 	7.78 
% 8.44 	5.89 	6.56 	6	0.017 	7.56 	6.56 	8.33 	0.481 	8.00 	0.818 	8.00 
% 7.67 	7.67 	7.89 	7	0.047 	8.11 	8.22 	7.89 	1.285 	8.33 	0.667 	8.22 
% 6.22 	6.56 	7.22 	3	0.015 	6.89 	7.67 	6.89 	0.973 	7.56 	0.714 	7.78 
% 8.33 	6.44 	7.89 	5	0.016 	6.67 	7.56 	6.78 	0.425 	7.00 	0.857 	7.67 
% 7.89 	6.11 	6.44 	3	0.018 	7.33 	6.67 	7.44 	0.348 	7.00 	0.857 	7.78 
% 8.22 	5.33 	6.00 	5	0.013 	7.22 	7.00 	6.89 	0.560 	7.00 	0.800 	7.44 
% 7.89 	6.67 	5.67 	2	0.042 	6.00 	6.44 	5.78 	0.337 	6.11 	1.000 	7.44 
% 6.67 	8.00 	7.00 	4	0.027 	7.56 	7.67 	7.56 	0.527 	7.22 	0.625 	8.11 
% 6.78 	5.67 	6.78 	2	0.019 	7.00 	6.56 	7.11 	0.661 	7.11 	0.727 	7.67 
% 5.22 	6.89 	5.56 	1	0.019 	8.22 	5.78 	8.56 	1.130 	8.33 	0.867 	8.22 
% 5.33 	6.78 	5.67 	2	0.014 	8.11 	5.56 	8.56 	1.210 	8.22 	0.588 	8.00 ];
%%
% 对x进行归一化处理
[m,n]=size(x);
if ~isempty(Max_max_No) && ~isempty(Min_min_No)
    for i = 1 : m
        for j1 = Max_max_No
          xx(i,j1) = (x(i,j1)-min(x(:,j1))) / (max(x(:,j1))-min(x(:,j1)));
        end
        for j2 = Min_min_No
          xx(i,j2) = (max(x(:,j2)-x(i,j2))) / (max(x(:,j2))-min(x(:,j2)));
        end    
    end
elseif ~isempty(Max_max_No) && isempty(Min_min_No) 
    for i = 1 : m
        for j1 = Max_max_No
          xx(i,j1) = (x(i,j1)-min(x(:,j1))) / (max(x(:,j1))-min(x(:,j1)));
        end
    end
elseif isempty(Max_max_No) && ~isempty(Min_min_No)
    for i = 1 : m
        for j2 = Min_min_No
          xx(i,j2) = (max(x(:,j2)-x(i,j2))) / (max(x(:,j2))-min(x(:,j2)));
        end    
    end
end
% 为了保证随机数运行结果一直而设置
s = RandStream('mt19937ar','Seed',0);
        RandStream.setGlobalStream(s);
        
for i = 1 : Run_No
    [a(i),b(i,:),e,f,t3(i),index{i},fv1{i}]=RAGA(N,n,xx,Pc,Pm,M,...
                                      DaiNo,Ci,ads,ac,exV,par_Q,coe_Q);
end
[amax, id]=max(a);
bmax = b(id,:);
index_max = index{id};
fv1_max = fv1{id};


